perm filename UNBIND.SAI[ALF,DEK] blob
sn#619056 filedate 1981-10-19 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 begin comment Translates Alphatype boundary data into symbolic form.
C00006 00003
C00011 00004 setprint("UNBIND.OUT","B")
C00014 ENDMK
C⊗;
begin comment Translates Alphatype boundary data into symbolic form.
Output is in UNBIND.OUT. The input is read from an .ANT file into an
array, one byte at a time, followed by -1;
require "{}{}" delimiters;
define crlf = { ('15 & '12) };
integer ant; string antnam;
integer chrno, sections, secno, encode, seed, dirptr;
preload_with
'0,'317,'176,'156,'3,'377,'377,'377,
'377,'377,'377,'377,'377,'340,'301,'203,
'7,'17,'36,'74,'170,'360,'340,'301,
'43,'340,'301,'203,'7,'17,'36,'74,
'170,'360,'340,'301,'66,'140,'32,'262,
'141,'303,'246,'151,'52,'126,'254,'252,
'312,'352,'72,'357,'226,'347,'171,'237,
'271,'317,'344,'276,'163,'347,'316,'235,
'334,'301,'354,'340,'166,'360,'340,'41,
'360,'240,'41,'360,'340,'301,'203,'7,
'17,'36,'74,'170,'360,'340,'301,'203,
'7,'17,'36,'74,'170,'360,'340,'301,
'203,'7,'17,'36,'74,'170,'360,'340,
'111,'14,'74,'150,'10,'74,'370,'6,
'144,'103,'262,'41,'331,'260,'141,'303,
'206,'115,'323,'124,'254,'232,'312,'362,
'136,'131,'226,'347,'171,'236,'71,'163,
'337,'367,'175,'47,'167,'356,'140,'166,
'360,'340,'301,'203,'7,'17,'36,'74,
'170,'360,'140,'41,'0,'0,'15,'144,
'257,'1,'240,'20,'360,'240,'21,'120,
'30,'170,'320,'10,'0,'0,'126,'144,
'256,'1,'340,'211,'200,'7,'15,'201,
'47,'6,'36,'64,'4,'0,
-1;
integer array inbytes[0:1024];
preload_with "SE ","S ","SW ","W ","NW ","N ","NE ","E ";
string array dircode[0:7];
preload_with +1,0,-1,-1,-1,0,+1,+1; integer array xdel[0:7];
preload_with -1,-1,-1,0,+1,+1,+1,0; integer array ydel[0:7];
integer i,eob,acc,bits,zero,x,y,nonzero;
procedure byte;
if eob=0 then
begin integer t; print(crlf,"'",cvos(t←inbytes[i]),"; "); i←i+1;
if t<0 then eob←1
else acc←acc+(t lsh bits);
bits←bits+8;
if t=0 then nonzero←0 else nonzero←1;
end;
integer procedure three;
begin integer t;
if bits<3 then byte;
t←acc land 7; acc←acc lsh -3; bits←bits-3;
print(t,": ");
return(t);
end;
procedure step(integer d);
begin integer dd; dd←d land 7;
print(dircode[dd]); x←x+xdel[dd]; y←y+ydel[dd];
end;
procedure doit;
begin "doit"
integer zz,zzc,dir;
zzc←3; i←0; eob←0;
while true do
begin acc←bits←0; byte;
if eob then done;
if acc neq 0 then print(crlf,"That byte should have been zero!");
acc←bits←0; byte; byte; dir←acc lsh -13; zz←(acc lsh -11) land 3;
if zz neq zzc then
print(crlf,"The zz value ",zz," should be ",zzc,"!");
zz←zzc; zzc←0;
x←acc land '3777; print(" starting column ",x,
", starting direction ",dircode[dir]);
acc←bits←0; byte; byte;
if acc>'7777 then
print(crlf,"Leading four bits should have been zero!");
y←acc land '3777; print(" starting row ",y);
if acc land '4000 then print(", coming from the left")
else print(", coming from the right");
if zz then
begin byte; print(" (these eight bytes are ignored...)");
byte; byte; byte; byte; byte; byte; byte;
end;
acc←bits←0;
while true do
begin case three of begin
[1] begin step(dir-1);step(dir-1);step(dir-1);
dir←(dir-1)land 7 end;
[2] begin step(dir-1);step(dir);step(dir-1);
dir←(dir-1)land 7 end;
[3] begin step(dir);step(dir-1);step(dir);
dir←(dir-1)land 7 end;
[4] begin step(dir);step(dir);step(dir) end;
[5] begin step(dir);step(dir+1);step(dir);
dir←(dir+1)land 7 end;
[6] begin step(dir+1);step(dir);step(dir+1);
dir←(dir+1)land 7 end;
[7] begin step(dir+1);step(dir+1);step(dir+1);
dir←(dir+1)land 7 end;
[0] begin case three of begin
[0] done;
[1] begin step(dir-1);step(dir-1);step(dir-2);
dir←(dir-2)land 7 end;
[2] begin step(dir-1);step(dir-2);step(dir-2);
dir←(dir-2)land 7 end;
[3] begin step(dir-2);step(dir-2);step(dir-2);
dir←(dir-2)land 7 end;
[5] begin step(dir+2);step(dir+2);step(dir+2);
dir←(dir+2)land 7 end;
[6] begin step(dir+1);step(dir+2);step(dir+2);
dir←(dir+2)land 7 end;
[7] begin step(dir+1);step(dir+1);step(dir+2);
dir←(dir+2)land 7 end;
[4] begin integer t; t←3*three+9;
if t=9 then print(crlf,"Bad codes (040)!")
else print(t,"x",dircode[dir]);
x←x+t*xdel[dir]; y←y+t*ydel[dir];
end;
else comment there's no other case;
end;
end;
else comment there's no other case;
end;
print(" (",x,",",y,") ");
end;
print(" end of cycle.");
if nonzero then
begin byte; if nonzero then print(" Should have been zero!");
end;
end;
print(crlf);
end "doit";
setprint("UNBIND.OUT","B");
doit;
end